/**
  ******************************************************************************
  * @file    bsp_flash.h
  * @author  Yun
  * @version V1.0.0
  * @date    2025-02-12
  * @brief   FLASH硬件抽象层头文件
  * @license EULA (End User License Agreement)
  *          Copyright (c) 2025 星瑜科技自动化 Co., Ltd. All rights reserved.
  ******************************************************************************
  */
#ifndef FRAMEWORK_BSP_FLASH_H
#define FRAMEWORK_BSP_FLASH_H

/*---------------------- Includes ----------------------*/
#include "bsp_common_type.h"
#include "flash_interface.h"

/*---------------------- 类型定义 ----------------------*/
/**
 * @brief FLASH配置结构体
 */
typedef struct Bsp_Flash_Cfg {
    uint32_t u32FlashBaseCfg;     /*!< FLASH基地址 */
    uint32_t u32FlashPageSizeCfg; /*!< FLASH页大小 */
    uint32_t u32FlashSizeCfg;     /*!< FLASH总大小 */
}Bsp_Flash_Cfg_TypeDef;

/**
 * @brief FLASH数据类型
 */
enum Bsp_Flash_Data_Type {
    BSP_FLASH_DATA_U8,     /*!< U8类型数据 */
    BSP_FLASH_DATA_U16,    /*!< U16类型数据 */
    BSP_FLASH_DATA_U32     /*!< U32类型数据 */
};



/*!
 * @brief 初始化FLASH设置
 * @param u32FlashBase FLASH基地址
 * @param u32FlashPageSize FLASH页大小
 * @param u32FlashSize FLASH总大小
 * @return BSP_OK:成功; BSP_ERROR:失败
 */
uint8_t Bsp_Flash_Init(uint32_t u32FlashBase, uint32_t u32FlashPageSize, uint32_t u32FlashSize);

/*!
 * @brief 读取FLASH数据
 * @param u32Addr FLASH地址
 * @param pBuffer 读出数据缓存
 * @param u32Len 读出数据长度
 * @param u8Mode 读出模式 @ref Bsp_Flash_Data_Type
 * @return BSP_OK:成功; BSP_ERROR:失败
 */
uint8_t Bsp_Flash_Read(uint32_t u32Addr, void* pBuffer, uint32_t u32Len, uint32_t u8Mode);

/*!
 * @brief 擦除FLASH数据
 * @param u32Addr FLASH地址
 * @param u32Len 擦除数据长度
 * @return BSP_OK:成功; BSP_ERROR:失败
 */
uint8_t Bsp_Flash_Erase(uint32_t u32Addr, uint32_t u32Len);

/*!
 * @brief 写入FLASH数据
 * @param u32Addr FLASH地址
 * @param pBuffer 写入数据缓存
 * @param u32Len 写入数据长度 @ref Bsp_Flash_Data_Type
 * @param u8Mode 写入模式 @ref Bsp_Flash_Data_Type
 * @return BSP_OK:成功; BSP_ERROR:失败
 * @note 该函数会擦除FLASH数据，请谨慎使用！
 */
uint8_t Bsp_Flash_Write(uint32_t u32Addr, void* pBuffer, uint32_t u32Len, uint32_t u8Mode);

/* FLASH接口 */
extern Flash_Interface_TypeDef stBspFlashInterface;

#endif //FRAMEWORK_BSP_FLASH_H
